'use strict';

const { Service } = require('egg');
const ModelName = 'PvForecastRelRecord'
class RouterService extends Service {
  /**
   * 根据分页和搜索条件获取
   * @param {Object} where 查询用户的条件
   * @param {Number} page 当前分页
   * @param {Number} pageSize 当前页每页多少条
   */
  async getPage(where, page, pageSize) {
    return this.ctx.model[ModelName].findAndCountAll({
      where,
      offset: pageSize * (page - 1),
      limit: pageSize,
      order:[
        // id 降序
        ['name','ASC']
      ],
    });
  }

  // 所有列表
  async allList(where) {
    return this.ctx.model[ModelName].findAll({
      where,
      order:[
        // id 降序
        ['name','ASC']
      ],
    });
  }
  async findOne(id) {
    return this.ctx.model[ModelName].findOne({
      where: {
        id,
      },
    });
  }

  /**
   * 处理电力输出异常告警
   * 实际功率与预测功率比较
   * 低等级报警：功率波动超过±5%。
   * 中等级报警：功率波动超过±7.5%。
   * 高等级报警：功率波动超过±10%。
   * actual_power
   * :
   * "20"
   * forecast_power
   * :
   * "10"
   */
  async handlePowerAlarm(data) {
    console.log(data)
    let result = {
      level: '',
      message: ''
    }
    if (data.actual_power && data.forecast_power) {
      let diff = Math.abs(data.actual_power - data.forecast_power) / data.forecast_power;
      if (diff > 0.1) {
        result.level = '3';
        result.message = '功率波动超过±10%';
      } else if (diff > 0.075) {
        result.level = '2';
        result.message = '功率波动超过±7.5%';
      } else if (diff > 0.05) {
        result.level = '1';
        result.message = '功率波动超过±5%';
      }
    }
    // 插入告警
    if (result.level) {
      await this.ctx.service.alarm.create({
        bus_val: `实际功率:${data.actual_power}KW,预测功率:${data.forecast_power}KW`,
        level: result.level,
        message: result.message,
        type: '1', // 电力输出异常
      });
    }
  }
  /**
   * 创建
   * @param {*} data 角色信息
   */
  async create(data) {
    // 实时数据
    if (data.type === 'realtime') {
      await this.handlePowerAlarm(data);
    }
    return this.ctx.model[ModelName].create(data);
  }

  /**
   * 根据ID修改
   * @param {Number} id ID
   * @param {Object} data 要修改的信息
   */
  async update(id, data) {
    return await this.ctx.model[ModelName].update(data, { where: { id } });
  }

  /**
   * 根据id删除
   * @param {Number}
   */
  async deleteById(id) {
    return await this.ctx.model[ModelName].destroy({ where: { id } });
  }
}

module.exports = RouterService;
